package com.cloud.basic.xmlFile;

import java.io.File;
import java.io.StringWriter;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.*;

/**
 * 使用JAVA DOM PARSER：修改 XML 文件
 *
 * @author zfc
 * @date 2017年12月7日 下午8:31:55
 */
public class ModifyXmlFile {
    public static void main(String[] args) {

        try {
            String filePath = "E:\\ProjectCode\\computer-basic-knowledge\\src\\main\\java\\com\\cloud\\basic\\xmlFile\\ModifyXmlFile.xml";
//            // 1、创建 File 对象，映射 XML 文件
            File file = new File(filePath);
//            // 2、创建 DocumentBuilderFactory 对象，用来创建 DocumentBuilder 对象
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//            // 3、创建 DocumentBuilder 对象，用来将 XML 文件 转化为 Document 对象
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
//            // 4、创建 Document 对象，解析 XML 文件
            Document document = documentBuilder.parse(file);
//            // 修改第一个 student
//            // 5、获取第一个 student 结点
            Node messageId = document.getElementsByTagName("MESSAGE_ID").item(0);
//            // 获取结点 student 结点的所有属性
            Element messageIdElement = (Element) messageId;
            messageIdElement.setTextContent("2222");
//            NamedNodeMap namedNodeMap = student.getAttributes();
//            // 获取界定 student 的 属性 id
//            Node id = namedNodeMap.getNamedItem("id");
//            // 给属性 id 重新设置值
//            id.setTextContent("student");
//            // 6、获取根结点 students 的第一个直接子结点 student
//            student = document.getElementsByTagName("student").item(0);
//            Element studentElement = (Element) student;
//            // 7、获取结点 student 的直接子结点 name、sex
//            Node name = studentElement.getElementsByTagName("name").item(0);
//            Node sex = studentElement.getElementsByTagName("sex").item(0);
//            Element nameElement = (Element) name;
//            Element sexElement = (Element) sex;
//            // 8、给节点进行设置值
//            nameElement.setTextContent("TomTom");
//            sexElement.setTextContent("FemaleFemale");
//
//            // 9、创建 TransformerFactory 对象
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
//            // 10、创建 Transformer 对象
            Transformer transformer = transformerFactory.newTransformer();
//            // 11、创建 DOMSource 对象
            DOMSource domSource = new DOMSource(document);
//            // 12、创建 StreamResult 对象
            StreamResult reStreamResult = new StreamResult(file);
            transformer.transform(domSource, reStreamResult);

            String s = xmlPrintFromFileName("E:\\ProjectCode\\computer-basic-knowledge\\src\\main\\java\\com\\cloud\\basic\\xmlFile\\ModifyXmlFile.xml");
            System.out.println("s = " + s);

//            // 输出测试结果
//            StreamResult consoleResult = new StreamResult(System.out);
//
//            transformer.transform(domSource, consoleResult);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static String xmlPrintFromFileName(String FileName) {
        String xml = "";
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory
                    .newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(FileName);
            Source oldData = new DOMSource(document);
            StreamResult newData = new StreamResult(new StringWriter());
            Transformer transformer = TransformerFactory.newInstance()
                    .newTransformer();
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.setOutputProperty(
                    "{http://xml.apache.org/xslt}indent-amount", "2");
            transformer.transform(oldData, newData);
            xml = newData.getWriter().toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return xml;
    }
}
